#ifndef NONMARTIALE_H
#define NONMARTIALE_H 1

#include "ADDArticleObjet.h"

#include <string>
#include <vector>
#include <iostream>

#include "TypeClasse.h"

/**
 * Classe qui implémente les compétences non-martiales, aussi connues
 * sour le nom de compétences diverses de l'univers AD&D.
 *
 * Une compétence non-martiales est caractérisée par un nom, un coût,
 * une valeur de base, un ou deux traits déterminant un ajustement et
 * une catégorie de classe pouvant l'apprendre.
 *
 * @author Johan "Solo" Luisier
 */
class NonMartiale : public ADDArticleObjet
{
 public:
  NonMartiale( const std::string& nom, const unsigned& prix,
	       const unsigned& base, const unsigned& trait1,
	       const unsigned& trait2, const TypeClasse& cat );
  NonMartiale( const std::string& nom, const unsigned& prix,
	       const unsigned& base, const unsigned& trait,
	       const TypeClasse& cat );
  NonMartiale( const std::string& nom = "", const unsigned& prix = 0,
	       const unsigned& base = 0, const TypeClasse& cat = Toutes );
  NonMartiale( const NonMartiale& nonMart );
  ~NonMartiale();
  /**
   * Méthode amie permettant de réaliser l'affichage de notre
   * compétence non martialie.
   *
   * @param os flot de sortie dans lequel on veut afficher notre
   * compétence.
   * @param nonMart compàtence à afficher.
   *
   * @return une référence sur os.
   */
  friend std::ostream& operator<<( std::ostream& os, const NonMartiale& nonMart );
  /**
   * Méthode amie permettant de réaliser l'affichage de notre
   * compétence non martialie.
   *
   * @param flot instance de FlotMessage dans laquelle on veut écrire.
   * @param nonMart compàtence à afficher.
   *
   * @return une référence sur os.
   */
  friend FlotMessage& operator<<( FlotMessage& flot,
				  const NonMartiale& nonMart );
  const NonMartiale& operator=( const NonMartiale& nonMart );
  const unsigned& valeurBase() const;
  unsigned nbrTraitBonus() const;
  const unsigned& traitBonus( const unsigned& i ) const;
  const vector< unsigned >& traitBonus() const;
  const TypeClasse& categorieAdmise() const;
 protected:
  unsigned ValeurBase;
  std::vector< unsigned > TraitBonus;
  TypeClasse CategorieAdmise;
 private:
  static const unsigned Inexistant;
};

const NonMartiale& nonMartialeInconnue();

#endif // NONMARTIALE_H
